package com.optimus.db.dao.impl;

import com.optimus.common.cvo.MapaCVO;
import com.optimus.common.cvo.MapaCVOList;
import com.optimus.common.util.ApplicationException;
import com.optimus.common.vo.BaseVO;
import com.optimus.common.vo.MapaVO;
import com.optimus.db.QueryFactory;
import com.optimus.db.dao.MapaDAO;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author victor
 */
public class MapaDAOImpl extends BaseDAO implements MapaDAO {

    private static  Logger logger = LoggerFactory.getLogger(MapaDAOImpl.class);

    public MapaDAOImpl(){
        super();
    }

    public MapaCVOList listar(MapaVO mapaVO) throws ApplicationException {
        Object[] logParams = new Object[2];
        MapaCVOList result = new MapaCVOList();
        result.setLista(new ArrayList<MapaCVO>());
        result.setTicket(mapaVO.getTicket());
        Long tk =result.getTicket();
        MapaCVO item = null;
        try {
            String queryStr=QueryFactory.instance().query("mapa_listar", mapaVO.getTicket());
            logParams[0] = queryStr;
            logParams[1] = mapaVO.getIdCampanaRecoleccion();
            Session session_db=session();
            session_db.beginTransaction();
            SQLQuery query = session_db.createSQLQuery(queryStr);
            query.setInteger("idcampanarecoleccion",mapaVO.getIdCampanaRecoleccion());
            Object objList = query.list();
            Object[] itemObj = null;
            for (Object obj : (List) objList) {
                itemObj = (Object[]) obj;
                item = new MapaCVO();
                item.setIdMapa(getInteger(itemObj[0], null, tk));
                item.setDescripcion(getString(itemObj[1], null, tk));
                item.setFechacreacion(getDate(itemObj[2], null, tk));
                item.setIdVerificador(getInteger(itemObj[3], null, tk));
                item.setVerificadorSeleccionado(getInteger(itemObj[3], null, tk));
                item.setMapaSeleccionado(getInteger(itemObj[0], null, tk));
                item.setEstadoRegistro(getString(itemObj[4], null, tk));
                item.setT(getString(itemObj[5], null, tk));
                item.setIdCampanaRecoleccion(getInteger(itemObj[6], null, tk));
                item.setIdUsuario(getString(itemObj[7], null, tk));
                result.getLista().add(item);
            }
            session_db.getTransaction().commit();
        } catch (Exception e) {
            throw new ApplicationException("MDB0000", e);
        } finally {
            logger.info("sql={} campana= {}", logParams);
        }
        return result;
    }

    public Integer obtenerCodigoMapa(Long tk) throws ApplicationException {
        Object[] logParams = new Object[2];
        MapaCVOList result = new MapaCVOList();
        result.setLista(new ArrayList<MapaCVO>());
        result.setTicket(tk);

        MapaCVO item = null;
        try {
            String queryStr=QueryFactory.instance().query("mapa_obtenercodigo", tk);
            logParams[0] = queryStr;
            Session session_db=session();
            session_db.beginTransaction();
            SQLQuery query = session_db.createSQLQuery(queryStr);
            Object objList = query.uniqueResult();
            if (objList instanceof BigInteger){
                return ((BigInteger)objList).intValue();
            }
            if( objList instanceof Integer){
                return (Integer) objList;
            }
        } catch (Exception e) {
            throw new ApplicationException("MDB0000", e);
        } finally {
            logger.info("sql={} ", logParams);
        }
        return 1;
    }


    public MapaVO insertar(MapaVO mapaVO) throws ApplicationException {
        Object[] logParams = new Object[2];
        Long tk = mapaVO.getTicket();
        Session session_db=null;
        try {
            String queryStr=QueryFactory.instance().query("mapa_insertar", mapaVO.getTicket());
            logParams[0] = queryStr;
            session_db = session();
            session_db.beginTransaction();
            Integer codigo = obtenerCodigoMapa(tk);
            SQLQuery query = session_db.createSQLQuery(queryStr);
            query.setInteger("idmapa", codigo);
            query.setInteger("idverificador", mapaVO.getIdVerificador());
            query.setString("descripcion", mapaVO.getDescripcion());
            query.setDate("fechacreacion", mapaVO.getFechacreacion());
            query.setString("estadoregistro", mapaVO.getEstadoRegistro());
            query.setString("t", mapaVO.getT());
            query.setInteger("idcampanarecoleccion", mapaVO.getIdCampanaRecoleccion());
            query.setString("idusuario", mapaVO.getIdUsuario());

            logger.debug("Tiket={} Antes de ejecutar query", new Object[]{tk} );
            int intResult = query.executeUpdate();
            session_db.getTransaction().commit();
            mapaVO.setIdMapa(codigo);
        } catch (Exception e) {
            if(session_db!=null){
                session_db.getTransaction().rollback();
            }
            throw new ApplicationException("MDB0000", e);
        } finally {
            logger.info("sql={} ", logParams);
        }
        return mapaVO;
    }

    

    public BaseVO update(MapaVO mapaVO) throws ApplicationException {
        Object[] logParams = new Object[2];
        BaseVO result = new BaseVO();
        Long tk = mapaVO.getTicket();
        result.setTicket(mapaVO.getTicket());
        Session session_db=null;
        try {
            String queryStr=QueryFactory.instance().query("mapa_actualizar", mapaVO.getTicket());//FIXME falta archivo
            logParams[0] = queryStr;
            session_db = session();
            session_db.beginTransaction();
            Integer codigo = obtenerCodigoMapa(tk);
            SQLQuery query = session_db.createSQLQuery(queryStr);
            query.setInteger("idmapa", codigo);
            query.setInteger("idverificador", mapaVO.getIdVerificador());

            logger.debug("Tiket={} Antes de ejecutar query", new Object[]{tk} );
            int intResult = query.executeUpdate();
            session.getTransaction().commit();
        } catch (Exception e) {
            throw new ApplicationException("MDB0000", e);
        } finally {
            logger.info("sql={} ", logParams);
        }
        return result;
    }

    public BaseVO eliminar(MapaVO mapaVO) throws ApplicationException {
        Object[] logParams = new Object[3];
        BaseVO result = new BaseVO();
        Long tk = mapaVO.getTicket();
        result.setTicket(mapaVO.getTicket());
        Session session_db=null;
        try {
            String queryStr=QueryFactory.instance().query("mapa_borrar", mapaVO.getTicket());//FIXME falta archivo
            logParams[0] = queryStr;
            session_db = session();
            session_db.beginTransaction();            
            SQLQuery query = session_db.createSQLQuery(queryStr);
            query.setInteger("idmapa", mapaVO.getIdMapa());
            logParams[1]=mapaVO.getIdMapa();
            logger.debug("Tiket={} Antes de ejecutar query", new Object[]{tk} );
            int intResult = query.executeUpdate();
            session.getTransaction().commit();
        } catch (Exception e) {
            throw new ApplicationException("MDB0000", e);
        } finally {
            logger.info("sql={} idmapa={}", logParams);
        }
        return result;
    }

}
